const isnumber = require("is-number")
/**
 * @param {import('egg').Application} app
 */
module.exports = function (app) {

	const validator = app.validator
	validator.addRule("numstr", function (rule, value) {
		if (!isnumber(value)) {
			return JSON.stringify(value) + "不是数字"
		}
	})
	validator.addRule("json", function (rule, value) {
		try {
			JSON.parse(value)
		} catch (error) {
			return "不是json"
		}
	})

	validator.addRule("jsonObject", function (rule, value) {
		try {
			let v = JSON.parse(value)
			if (!(v instanceof Object)) {
				return "不是有效的Object"
			}
		} catch (error) {
			return "不是json"
		}
	})
	validator.addRule("pnumstr", function (rule, value) {
		if (!isnumber(value)) {
			return JSON.stringify(value) + "不是数字"
		}
		if (value < 0) {
			return JSON.stringify(value) + "不应该小于0"
		}
	})

	validator.addRule("intstr", function (rule, value) {
		if (!isnumber(value)) {
			return JSON.stringify(value) + "不是数字"
		}
		value = Number(value)
		if (Math.floor(value) !== value) {
			return JSON.stringify(value) + "不是不是整数"
		}
	})

	validator.addRule("pintstr", function (rule, value) {
		if (!isnumber(value)) {
			return JSON.stringify(value) + "不是数字"
		}
		value = Number(value)
		if (Math.floor(value) !== value || value < 0) {
			return JSON.stringify(value) + "不是不是正整数"
		}
	})
	validator.addRule("arraystr", function (rule, value) {
		try {
			var arr = JSON.parse(value)
			if (!Array.isArray(arr)) {
				return JSON.stringify(value) + "不是有效数组"
			}
		} catch (error) {
			return JSON.stringify(value) + "不是有效数组"
		}
	})

	validator.addRule("alphanum", function (rule, value) {
		let res = app.validator.validate({value: "string"}, {value})
		if (res) {
			return value + "不合法字符串"
		} else {
			if (!/^[0-9a-zA-Z]+$/.test(value)) {
				return value + "：不能包含数字字母外其他字符"
			}
		}
	})
}